package prestar.dominio.entidades;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import prestar.dominio.controladores.Financiera;

public class Cuota 
{
    private int codigo;
    
    private Date fecha;

    private double interes;

    private double monto;
    
    private Financiamiento financiamiento;
    
    private List<ItemCobro> cobros = new ArrayList<ItemCobro>();

    public Cuota() {
    }

    public Cuota(Date fecha, double interes, double monto) 
    {
        this.fecha = fecha;
        this.interes = interes;
        this.monto = monto;
    }

    public int getCodigo() {
        return codigo;
    }

    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }
   

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public double getInteres() {
        return interes;
    }

    public void setInteres(double interes) {
        this.interes = interes;
    }

    public double getMonto() {
        return monto;
    }

    public void setMonto(double monto) {
        this.monto = monto;
    }

    public Financiamiento getFinanciamiento() {
        return financiamiento;
    }

    public void setFinanciamiento(Financiamiento financiamiento) {
        this.financiamiento = financiamiento;
    }

    public List<ItemCobro> getCobros() {
        return cobros;
    }

    public void setCobros(List<ItemCobro> cobros) {
        this.cobros = cobros;
    }
    
    public double cobrado()
    {
        double cob = 0;
        for (ItemCobro c : this.getCobros())
        {
            cob += c.getMonto() - c.getMora();
        }
        return cob;
    }
    public long periodosAtrasados()
    {
        long periodos = 0;
        long MILLSECS_PER_DAY = 24 * 60 * 60 * 1000; //Milisegundos al día 
        Date hoy = new Date(); //Fecha de hoy 

        long diferencia = ( hoy.getTime() - fecha.getTime() )/MILLSECS_PER_DAY; 
        
        switch (this.getFinanciamiento().getFrecCuotas()) {
            case "Anuales":
            {
                periodos = diferencia / 365;
                break;
            }
            case "Mensuales":
            {
                periodos = diferencia / 365 / 12;
                break;
            }
            case "Semanales":
            {
                periodos = diferencia / 365 / 12 / 4;
                break;
            }
            case "Diarias":
            {
                periodos = diferencia;
                break;
            }
        }
        
        
        return periodos;
    }
    public double getMora()
    {
        double mora = 0;
        Calendar fechaCuota = Calendar.getInstance();
        fechaCuota.setTime(this.getFecha());
        fechaCuota.add(Calendar.DAY_OF_YEAR, Financiera.getInstancia().getMora().getGracia());
        if (new Date().after(fechaCuota.getTime()))
        {
            
            double moraCuota = 0;
            long periodos = this.periodosAtrasados();
            moraCuota = this.getBalance() * Financiera.getInstancia().getMora().getCantidad() / 100;
            
            for (int periodo = 1; periodo <= periodos + 1; periodo++)
            {
                mora += moraCuota * periodo;
            }
        }
        
        return mora;
    }
    public double getTerminoAmortizativo()
    {
        return this.getInteres() + this.getMonto();
    }
    public double getBalance()
    {        
        return this.getTerminoAmortizativo() - this.cobrado();
    }
    
}
